// 配置路由的地方
import Vue from "vue";
import VueRouter from "vue-router";
// 使用插件
Vue.use(VueRouter);
import routes from "./routes";
//引入store
import store from "../store";

//1、先把VueRouter原型对象的push，保存一份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;
//2、重写push|replace
//第一个参数：告诉原来的push，跳转的目标位置和传递了哪些参数
VueRouter.prototype.push = function (location, resolve, reject) {
  if (resolve && reject) {
    originPush.call(this, location, resolve, reject);
  } else {
    originPush.call(
      this,
      location,
      () => {},
      () => {}
    );
  }
};
VueRouter.prototype.replace = function (location, resolve, reject) {
  if (resolve && reject) {
    originReplace.call(this, location, resolve, reject);
  } else {
    originReplace.call(
      this,
      location,
      () => {},
      () => {}
    );
  }
};

// 配置路由
const router = new VueRouter({
  // 配置路由
  routes,
  // eslint-disable-next-line no-unused-vars
  scrollBehavior(to, from, savedPosition) {
    return { y: 0 };
  },
});

// 全局守卫：前置守卫（在路由跳转之间进行判断）
router.beforeEach(async (to, from, next) => {
  // 获取仓库中的token-----可以确定用户是登录了
  let token = store.state.user.token;
  let name = store.state.user.userInfo.name;
  if (token) {
    // 已经登录而且还想去登录和注册------不行
    if (to.path == "/login" || to.path == "/register") {
      next("/");
    } else {
      // 已经登陆了,访问的是非登录与注册
      // 登录了且拥有用户信息放行
      if (name) {
        next();
      } else {
        // 登陆了且没有用户信息
        // 在路由跳转之前获取用户信息且放行
        try {
          await store.dispatch("getUserInfo");
          next();
        } catch (error) {
          // token失效从新登录
          await store.dispatch("userLogout");
          next("/login");
        }
      }
    }
  } else {
    // 未登录：不能去交易相关、不能去支付相关【pay|paysuccess】、不能去个人中心
    // 未登录去上面这些路由-----登录
    let toPath = to.path;
    if (
      toPath.indexOf("/trade") != -1 ||
      toPath.indexOf("/pay") != -1 ||
      toPath.indexOf("/center") != -1
    ) {
      // 把未登录的时候向去而没有去成的信息，存储于地址栏中【路由】
      next("/login?redirect=" + toPath);
    } else {
      // 去的不是上面这些路由（home|search|shopCart）---放行
      next();
    }
  }
});

//全局后置守卫：初始化时执行、每次路由切换后执行
router.afterEach((to) => {
  if (to.meta.title) {
    document.title = to.meta.title; //修改网页的title
  } else {
    document.title = "尚品汇";
  }
});

export default router;
